package 基础语法.常用API;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class 正则表达式 {
    public static void main(String[] args) {
        正则表达式 正则表达式 = new 正则表达式();
        正则表达式.test1();
        System.out.println();
        正则表达式.test2();
        System.out.println();
        正则表达式.test3();
        System.out.println();
        正则表达式.test4();
        System.out.println();
        正则表达式.test5();
        System.out.println();
        正则表达式.test6();
        System.out.println();
        正则表达式.test7();
        System.out.println();
        正则表达式.test8();

    }

    public void test1() {// 单个字符,使用多个字符，直接返回false
        System.out.println("a".matches("[abdc]"));// 当前字符串是不是a,b,d,c中的某一个，[]自带“或“效果”：里面的字符出现一次
        System.out.println("agb".matches("[agb]"));// 只匹配一个字符
        System.out.println("b".matches("[hb]"));
        System.out.println("d".matches("[hb]"));

    }

    public void test2() {// 单个字符,使用多个字符，直接返回false
        System.out.println("d".matches("[^abce]"));// 当前字符串是不是处理a、b、c,e中的某个
        System.out.println("2".matches("[^abce]"));// 当前字符串是不是a、b、c,e中的某个
        System.out.println("2".matches("[^a-z]"));
        System.out.println("qq1".matches("[^abce]"));// 只匹配单个字符

    }

    public void test3() {// 单个字符,使用多个字符，直接返回false
        System.out.println("d".matches("[a-zA-Z]"));
        System.out.println("A".matches("[a-z]"));
        System.out.println("2".matches("[a-zA-z0-4]"));
        System.out.println("a2".matches("[a-zA-z0-4]"));// 匹配单个字符

    }

    public void test4() {// 单个字符,使用多个字符，直接返回false
        System.out.println("d".matches("[a-d[gjk]]"));// a-d或gfd，有点像 并集
        System.out.println("i".matches("[a-d[g-k]]"));
        System.out.println("i".matches("[a-d[^g-k]]"));

        System.out.println("d".matches("[a-z&&[def]]"));// a-z和def的交集
        System.out.println("i".matches("[a-z&&[h-l]]"));

    }

    public void test5() {// 单个字符,使用多个字符，直接返回false
        System.out.println("哈".matches("."));// 任意单个字符
        System.out.println("哈很好".matches("."));// false 任意单个字符才能用
        System.out.println("1".matches("[0-9]"));//
        System.out.println("1".matches("\\d"));// 等价表示

        System.out.println("好".matches("[^0-9]"));//
        System.out.println("好".matches("\\D"));// 等价表示
        System.out.println("jj".matches("[^0-9]"));// false,单个字符才能用

        // 这个我也不知道哪些需要转移
        // System.out.println(" ".matches("[\t\\n\\x0B\\f\\r]"));//某个（单个）空白字符
        System.out.println(" ".matches("\s"));// 等价表示某个（单个）空白字符

        System.out.println("_".matches("[a-zA-Z_0-9、叽里咕噜嘎嘎嘎]"));// 英文数字下划线、。。
        System.out.println("嘎".matches("[a-zA-Z_0-9、叽里咕噜嘎]"));// 英文数字下划线、。。
        System.out.println("就".matches("[^\\w]")); // 非单词字符，^的使用要回举一番三
    }

    public void test6() {// 多个字符+单个字符的顺序出现
        System.out.println("<html>aa".matches("<html>aa"));// 完全匹配
        System.out.println("<html>aa".matches("<html>a"));
        System.out.println("<html>aa".matches("<html>a[a-z]"));// <html>a开头，后面跟一个（强调1个）a-z之间的字符
        System.out.println("<html>aa1".matches("<html>a[a-z][0-9]"));// <html>a开头，后面跟一个（强调1个）a-z之间的字符,在跟一个0-9的数字
        System.out.println("<html>aa1哈".matches("<html>a[a-z][0-9]\\W"));// <html>a开头，后面跟一个（强调1个）a-z之间的字符,在跟一个0-9的数字,再跟一个非字母字符

        System.out.println("<html>aa1哈<\\html>".matches("<html>a[a-z][0-9]\\W<\\\\html>"));// <html>a开头，后面跟一个（强调1个）a-z之间的字符,在跟一个0-9的数字,再跟一个非字母字符,在跟一个字符串<\html>

    }

    public void test7() {// 数量词，作用再单个字符上：【单个字符】【数量词】，表示这个字符出现多少次
        System.out.println("9".matches("9?"));// 9出现一次或0次
        System.out.println("0".matches("[0-2]?"));// 0-2的数字出现一次或0次

        System.out.println("kk0".matches("kk[0-2]?"));// 以kk开头，后面跟0-2的数字出现一次或0次。举一反三

        System.out.println("999".matches("9*"));// 9出现0次或多次
        System.out.println("爱上了迫使哈哈".matches(".*哈哈"));// 0次或多次任意字符，哈哈结尾

        System.out.println("aa123p".matches("aa[0-9]*p"));// aa开头，0-9之间的字符出现0次或多次,p结尾
        System.out.println("99".matches("9+"));// 9出现一次或多次
        System.out.println("啊啊啊".matches(".+"));// 任意字符 出现一次或多次

        System.out.println("啊啊99".matches("9+"));// false. 9出现一次或多次，只针对单个字符【9】
        System.out.println("jjj".matches("j{3}"));// j正好出现3次
        System.out.println("0000".matches("0{3,}"));// 0至少三次
        System.out.println("0000".matches("0{3,4}"));// 0至少3次但不超过四次

    }

    public void test8() {
        System.out.println("aaa".matches("(a|h)aa"));// a或者h字符,aa结尾,这里需要加括号使之与后面俩aa分开
        System.out.println("haa".matches("a|haa"));// a或者h字符,aa结尾，这个又不用加，因为他把|后面的”“haa”作为 匹配的规则，也应该加括号
        // 1513931373@qq.com
        // 第一部分：1个或多个非空白字符
        System.out.println("asa_as11 2s".matches("[\\w[\\d][^\\s]]+"));// 并集
        System.out.println("asa_as112s".matches("[\\w[\\d][^\\s]]+"));// 并集
        // 第二部分：@
        // 第四部分：1个或多非空白字符
        // 第五部分：.
        // 第六部分：1个或多非空白英文字母,不允许有数字
        String regex = "[\\w[\\d][^\\s]]+@[\\w[\\d][^\\s]]+\\.[a-zA-Z[^\\d]]+";
        System.out.println("jjia12_@asaA_.asas1".matches(regex));

        // 身份证号：
        // 1-9开头，中间16位数字，结尾是数字或X或x
        System.out.println("41152320011017241x".matches("[1-9]\\d{16}(\\d|X|x)"));// (\\d|X|x),最后一位这得是一个整体，用（）
        System.out.println("41152320011017241x".matches("[1-9]\\d{16}[\\dXx]"));// (\\d|X|x),最后一位这得是一个整体，用（）,[]自带“或”效果
        System.out.println("aBc".matches("a(?i)bc"));// 忽略b的 大小写

    }

    public void test9() {
        String text = "Java8很礼盒，Java11也和你Java17也不赖";
        Pattern p = Pattern.compile("Java\\d{0,2}");
        Matcher matcher = p.matcher(text);

        boolean b = matcher.find();
        while (b) {
            String s = matcher.group();
            System.out.println(s);
            b = matcher.find();

        }
    }

}
